package com.example.customview.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;

import com.example.customview.R;

/**
 * 描述
 *
 * @创建时间 2023/2/19 20:47
 */
public class MyTextView extends View {

    private String mText;

    private int mTextSize = 15;

    private int mTextColor = Color.BLACK;

    private Paint mPaint;

    // 构造函数会在代码里面new的时候调用
    // TextView tv = new TextView(this)
    public MyTextView(Context context) {
        this(context,null);
    }

    // 在布局layout中使用
    /*
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:ignore="MissingConstraints" />
     */
    public MyTextView(Context context, @Nullable AttributeSet attrs) {
       this(context,attrs,0);
    }

    //在布局layout中使用（调用），但是会有style
    public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        // 获取自定义属性
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TextView);

        mText = array.getString(R.styleable.TextView_darrentext);
        mTextColor = array.getColor(R.styleable.TextView_darrentextColor, mTextColor);
        // 15 15px 15sp
        mTextSize = array.getDimensionPixelSize(R.styleable.TextView_darrentextSize, sp2px(mTextSize));

        // 回收
        array.recycle();

        mPaint = new Paint();
        //抗锯齿
        mPaint.setAntiAlias(true);
        mPaint.setTextSize(mTextSize);
        mPaint.setColor(mTextColor);
    }

    private int sp2px(int sp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,sp,getResources().getDisplayMetrics());
    }

    public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    /**
     * 自定义view的测量方法
     * n
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //布局的宽高都是由这个方法指定
        //指定控件的宽高  需要测量
        // 获取宽高的模式
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        // 获取前两位
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        //1、确定的值，这个时候不需要计算，给多少就是多少
        int width = MeasureSpec.getSize(widthMeasureSpec);
        //2、给的是wrap_context  需要计算
        if (widthMode == MeasureSpec.AT_MOST){
            // 计算的宽度 与 字体的长度有关，与字体的大小，用画笔确定
            Rect bounds = new Rect();
            //获取文本的Rect
            mPaint.getTextBounds(mText,0,mText.length(),bounds);
            width = bounds.width();
        }
        //1、确定的值，这个时候不需要计算，给多少就是多少
        int height = MeasureSpec.getSize(heightMeasureSpec);
        //2、给的是wrap_context  需要计算
        if (heightMode == MeasureSpec.AT_MOST){
            // 计算的宽度 与 字体的长度有关，与字体的大小，用画笔确定
            Rect bounds = new Rect();
            //获取文本的Rect
            mPaint.getTextBounds(mText,0,mText.length(),bounds);
            height = bounds.width();
        }
        setMeasuredDimension(width,height);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //画文本
        // canvas.drawText();
        //画圆
        // canvas.drawArc();
        //画弧形
       //  canvas.drawCircle();
        // 画文字 text  x  y  paint
        // x 就是开始的位置   0
        // y 基线 baseLine   求？   getHeight()/2知道的   centerY
        Paint.FontMetrics fontMetrics = new Paint.FontMetrics();
        int dy = (int) ((fontMetrics.bottom-fontMetrics.top)-fontMetrics.bottom);
        int baseline = getHeight()/2 + dy;
        canvas.drawText(mText,0,getHeight()/2,mPaint);

    }

    /**
     * 手指触摸 触摸事件
     * 事件分发，事件拦截
     * @param event
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                //手指按下
                break;
            case MotionEvent.ACTION_MOVE:
                //手指移动
                break;
            case MotionEvent.ACTION_UP:
                //手指抬起
                break;
        }
        return super.onTouchEvent(event);
    }
}
